1   /** hard coded linenumbers in other tests - DO NOT CHANGE
2    *  @test/nodynamiccopyright/
3    *  @bug 4490824
4    *  @summary JDI: provide arguments when no debug attributes present
5    *
6    *  @author jjh
7    *
8    *  @run build TestScaffold VMConnection TargetListener TargetAdapter
9    *  @run compile ArgumentValuesTest.java
10   *  @run main ArgumentValuesTest
11   */
12  import com.sun.jdi.*;
13  import com.sun.jdi.event.*;
14  import com.sun.jdi.request.*;
15  
16  import java.util.*;
17  
18   /********** target program **********/
19  
20  class ArgumentValuesTarg {
21      static char s_char1 = 'a';
22      static byte s_byte1 = (byte) 146;
23      static short s_short1 = (short) 28123;
24      static int s_int1 = 3101246;
25      static long s_long1 = 0x0123456789ABCDEFL;
26      static float s_float1 = 2.3145f;
27      static double s_double1 = 1.469d;
28      static int s_iarray1[] = {1, 2, 3};
29      static int s_marray1[][] = {{1, 2, 3}, {3, 4, 5}, null, {6, 7}};
30      static String s_sarray1[] = {"abc", null, "def", "ghi"};
31      static String s_string1 = "abcdef";
32  
33      static String s_string2 = "xy";
34      static String s_string3 = "wz";
35      static List<Integer> intList;
36  
37      public static void noArgs() {
38          int index = 0;     // line 38
39      }
40  
41      public static void allArgs(char p_char, byte p_byte, short p_short,
42                                 int p_int, long p_long, float p_float,
43                                 double p_double, int p_iarray[], int p_marray[][],
44                                 String p_sarray1[], String p_string) {
45          int index = 0;      // line 45
46      }
47  
48      public static void varArgs(String ... p1) {
49          int index = 0;     // line 49
50      }
51  
52      public static void genericArgs(List<Integer> p1) {
53          int index = 0;     // line 53
54      }
55  
56      public void instanceMethod(char p_char, byte p_byte) {
57          int index = 0;     // line 57
58      }
59  
60      public static void main(String[] args) {
61          System.out.println("Howdy!");
62          allArgs(
63                  s_char1,   s_byte1,   s_short1,  s_int1,
64                  s_long1,   s_float1,  s_double1, s_iarray1,
65                  s_marray1, s_sarray1, s_string1);
66  
67          noArgs();
68          varArgs(s_string1, s_string2, s_string3);
69          ArgumentValuesTarg avt = new ArgumentValuesTarg();
70          intList = new ArrayList<Integer>(10);
71          intList.add(10);
72          intList.add(20);
73          genericArgs(intList);
74  
75          avt.instanceMethod(s_char1, s_byte1);
76  
77          System.out.println("Goodbye from ArgumentValuesTarg!");
78      }
79  }
80  
81   /********** test program **********/
82  
83  public class ArgumentValuesTest extends TestScaffold {
84      // Must be in same order as args to allArgs(....)
85      String fieldNames[] = {"s_char1",   "s_byte1",   "s_short1",  "s_int1",
86                             "s_long1",   "s_float1",  "s_double1", "s_iarray1",
87                             "s_marray1", "s_sarray1", "s_string1"};
88  
89      String fieldNamesVarArgs[] = {"s_string1", "s_string2", "s_string3"};
90      String fieldNamesInstance[] = {"s_char1",   "s_byte1"};
91  
92      ReferenceType targetClass;
93      ThreadReference mainThread;
94  
95      ArgumentValuesTest (String args[]) {
96          super(args);
97      }
98  
99      public static void main(String[] args)
100         throws Exception
101     {
102         new ArgumentValuesTest (args).startTests();
103     }
104 
105     /********** test core **********/
106 
107     protected void runTests()
108         throws Exception
109     {
110         /*
111          * Get to the top of main() to determine targetClass and mainThread
112          */
113         BreakpointEvent bpe = startToMain("ArgumentValuesTarg");
114         targetClass = bpe.location().declaringType();
115         mainThread = bpe.thread();
116         EventRequestManager erm = vm().eventRequestManager();
117 
118 
119         {
120             System.out.println("----- Testing each type of arg");
121             bpe = resumeTo("ArgumentValuesTarg", 45);
122             StackFrame frame = bpe.thread().frame(0);
123 
124             Method mmm = frame.location().method();
125             System.out.println("Arg types are: " + mmm.argumentTypeNames());
126 
127             List<Value> argVals = frame.getArgumentValues();
128 
129             if (argVals.size() != fieldNames.length) {
130                 failure("failure: Varargs: expected length " + fieldNames.length +
131                         " args, got: " + argVals);
132             }
133             for (int ii = 0; ii < argVals.size(); ii++) {
134                 Value gotVal = argVals.get(ii);
135 
136                 Field theField = targetClass.fieldByName(fieldNames[ii]);
137                 Value expectedVal = targetClass.getValue(theField);
138                 System.out.println(fieldNames[ii] + ": gotVal = " + gotVal +
139                                    ", expected = " + expectedVal);
140                 //System.out.println(gotVal.getClass() + ", " + expectedVal.getClass());
141                 if (!gotVal.equals(expectedVal)) {
142                     failure("     failure: gotVal != expected");
143                 }
144             }
145         }
146 
147         // a method with no params
148         {
149             System.out.println("----- Testing no args");
150             bpe = resumeTo("ArgumentValuesTarg", 38);
151             StackFrame frame = bpe.thread().frame(0);
152 
153             Method mmm = frame.location().method();
154             System.out.println("Arg types are: " + mmm.argumentTypeNames());
155 
156             List<Value> argVals = frame.getArgumentValues();
157             if (argVals.size() == 0) {
158                 System.out.println("Empty arg list ok");
159             } else {
160                 failure("failure: Expected empty val list, got: " + argVals);
161             }
162         }
163 
164         // var args.  3 Strings are passed in and they appear
165         // as a String[3] in the method.
166         {
167             System.out.println("----- Testing var args");
168             bpe = resumeTo("ArgumentValuesTarg", 49);
169             StackFrame frame = bpe.thread().frame(0);
170 
171             Method mmm = frame.location().method();
172             System.out.println("Arg types are: " + mmm.argumentTypeNames());
173 
174             List<Value> argVals = frame.getArgumentValues();
175             if (argVals.size() != 1) {
176                 failure("failure: Varargs: expected one arg, got: " + argVals);
177             }
178             argVals = ((ArrayReference)argVals.get(0)).getValues();
179 
180             if (argVals.size() != fieldNamesVarArgs.length) {
181                 failure("failure: Varargs: expected length " + fieldNamesVarArgs.length +
182                         " array elements, got: " + argVals);
183             }
184 
185             for (int ii = 0; ii < argVals.size(); ii++) {
186                 Value gotVal = argVals.get(ii);
187 
188                 Field theField = targetClass.fieldByName(fieldNamesVarArgs[ii]);
189                 Value expectedVal = targetClass.getValue(theField);
190                 System.out.println(fieldNamesVarArgs[ii] + ": gotVal = " + gotVal +
191                                    ", expected = " + expectedVal);
192                 //System.out.println(gotVal.getClass() + ", " + expectedVal.getClass());
193                 if (!gotVal.equals(expectedVal)) {
194                     failure("     failure: gotVal != expected");
195                 }
196             }
197         }
198 
199         // a method with with one generic param
200         {
201             System.out.println("----- Testing generic args");
202             bpe = resumeTo("ArgumentValuesTarg", 53);
203             StackFrame frame = bpe.thread().frame(0);
204 
205             Method mmm = frame.location().method();
206             System.out.println("Arg types are: " + mmm.argumentTypeNames());
207 
208             List<Value> argVals = frame.getArgumentValues();
209             if (argVals.size() != 1) {
210                 failure("failure: Expected one arg, got: " + argVals);
211             } else {
212                 Value gotVal = argVals.get(0);
213 
214                 Field theField = targetClass.fieldByName("intList");
215                 Value expectedVal = targetClass.getValue(theField);
216                 System.out.println("intList " + ": gotVal = " + gotVal +
217                                    ", expected = " + expectedVal);
218                 if (!gotVal.equals(expectedVal)) {
219                     failure("failure: gotVal != expected");
220                 }
221             }
222         }
223 
224         // test instance method call
225         {
226             System.out.println("----- Testing instance method call");
227             bpe = resumeTo("ArgumentValuesTarg", 57);
228             StackFrame frame = bpe.thread().frame(0);
229 
230             Method mmm = frame.location().method();
231             System.out.println("Arg types are: " + mmm.argumentTypeNames());
232 
233             List<Value> argVals = frame.getArgumentValues();
234 
235             if (argVals.size() != fieldNamesInstance.length) {
236                 failure("failure: Varargs: expected length " + fieldNamesInstance.length +
237                         " args, got: " + argVals);
238             }
239             for (int ii = 0; ii < argVals.size(); ii++) {
240                 Value gotVal = argVals.get(ii);
241 
242                 Field theField = targetClass.fieldByName(fieldNamesInstance[ii]);
243                 Value expectedVal = targetClass.getValue(theField);
244                 System.out.println(fieldNamesInstance[ii] + ": gotVal = " + gotVal +
245                                    ", expected = " + expectedVal);
246                 //System.out.println(gotVal.getClass() + ", " + expectedVal.getClass());
247                 if (!gotVal.equals(expectedVal)) {
248                     failure("     failure: gotVal != expected");
249                 }
250             }
251         }
252 
253 
254         /*
255          * resume the target listening for events
256          */
257         listenUntilVMDisconnect();
258 
259         /*
260          * deal with results of test if anything has called failure("foo")
261          * testFailed will be true
262          */
263         if (!testFailed) {
264             println("ArgumentValuesTest: passed");
265         } else {
266             throw new Exception("ArgumentValuesTest: failed");
267         }
268     }
269 }